#include <func.h>
/*
    信号量的PV操作
*/
int main()
{
    int semid = semget(1000, 2, IPC_CREAT|0600);
    ERROR_CHECK(semid, -1, "semget");

    // 0是产品，1是空位
    unsigned short arr[2] = {0, 10};

    int ret = semctl(semid, 0, SETALL, arr);
    ERROR_CHECK(ret, -1, "semctl");


    // 父进程是生产者，子进程是消费者
    if (!fork())
    { // 生产者消耗空位，生产产品
        struct sembuf P, V;
        P.sem_num = 1;
        P.sem_op = -1;
        P.sem_flg = 0;
        V.sem_num = 0;
        V.sem_op = +1;
        V.sem_flg = 0;
        while (1)
        {
            semop(semid, &P, 1);
            printf("我是生产者，现在产品数：%d，空位数：%d\n",\
                    semctl(semid, 0, GETVAL), semctl(semid, 1, GETVAL) );
            semop(semid, &V, 1);
            sleep(1);
        }

    } else {
        // 消费者消耗产品，生产空位
        struct sembuf P, V;
        P.sem_num = 0;
        P.sem_op = -1;
        P.sem_flg = 0;
        V.sem_num = 1;
        V.sem_op = +1;
        V.sem_flg = 0;

        while (1)
        {
            semop(semid, &P, 1);
            printf("我是消费者，现在产品数：%d，空位数：%d\n",\
                    semctl(semid, 0, GETVAL), semctl(semid, 1, GETVAL) );
            semop(semid, &V, 1);
            sleep(2);
        }

    }

    return 0;
}